/**
 * Copyright (c) 2016-2019 人人开源 All rights reserved.
 *
 * https://www.renren.io
 *
 * 版权所有，侵权必究！
 */

package com.ruoyi.common.core.web.controller;

import com.ruoyi.common.core.domain.RR;
import com.ruoyi.common.core.exception.RRException;
import com.ruoyi.common.core.jdkext.Action0;
import com.ruoyi.common.core.utils.SpringContextUtils;
import lombok.extern.slf4j.Slf4j;

import java.util.Map;
import java.util.function.Supplier;

/**
 * Controller公共组件
 * @author zxb
 *
 */
@Slf4j
public abstract class AbstractController {


	protected static <TService> TService ref(Class<TService> clazz) {
		return SpringContextUtils.getBean(clazz);
	}


//	protected SysUserEntity getUser() {
//		return (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
//	}
//
//	protected String getUserId() {
//		return getUser().getId();
//	}

	/**
	 * 有返回值 异常处理
	 * @param supplier
	 * @param <T>
	 * @return
	 * call(()-> xxxService.queryPage(params));//调用方式
	 */
	protected static <T> RR callData(Supplier<T> supplier){
		try{
			return RR.ok().put("data",supplier.get());
		}catch(RRException e) {
			log.error("RRException:{}", e.getMessage(), e);
			return RR.error(e.getMessage());
		} catch(Exception e){
			log.error("获取数据异常信息:{}",e.getMessage(),e);
//			return R.error("网络异常");

			return RR.error(e.getMessage());
		}
	}

//	protected static <T> R callSignData(Supplier<T> supplier){
//		try{
//			T t = supplier.get();
//			Map<String,Object> keyMap = RSAUtils.genKeyPair();
//			String publicKey = RSAUtils.getPublicKey(keyMap);
//			String privateKey = RSAUtils.getPrivateKey(keyMap);
//			String sign = SignUtils.sign(t.toString(),privateKey);
//			return R.ok().put("data",t).put("sign",sign).put("signPublicKey",publicKey);
//		}catch(RRException e){
//			log.error("RRException:{}",e.getMessage(),e);
//			return R.error(e.getMessage());
//		}catch(Exception e){
//			log.error("获取数据异常信息:{}",e.getMessage(),e);
////			return R.error("网络异常");
//
//			return R.error(e.getMessage());
//		}
//	}


	/**
	 * 无返回值调用 异常处理
	 * @param x
	 * @return
	 *   callAuto(()->barrierService.saveBarrier(barrier))
	 */
	protected static RR callAuto(Action0 x){
		try{
			x.call();
			return RR.ok();
		}catch(RRException e){
			log.error("RRException:{}",e.getMessage(),e);
			return RR.error(e.getMessage());
		}catch(Exception e){
			log.error("异常信息:{}",e.getMessage(),e);
//			return R.error("网络异常");
			return RR.error(e.getMessage());
		}
	}

}
